package masterclient;

import Protocol.ClientObject;
import Protocol.ComProtocol;
import Protocol.ReturnObject;
import java.security.MessageDigest;
import java.util.ArrayList;

/**
 * In deze klasse worden de account bewerkingen afgehandeld
 * @author Michael Stevens
 * @since 30-05-2012
 */
public class User {
    
    private Masterclient mc;
    private ComProtocol cp;
    private String[][] data;
    private String[] name;
    
    public User(Masterclient mc){
        this.mc = mc;
    }
    
    /**
    * Deze methode haalt alle gebruikers op uit de database en vult een Combolist met de namen
    * @author Michael Stevens
    * @since 30-05-2012
    */
    public void getUsers(){
        cp = new ComProtocol("localhost", 5555);
        ClientObject o = new ClientObject("system", "54b53072540eeeb8f8e9343e71f28176", cp.getAuthSelectQuery(), "SELECT [User ID], [Name], [Password], [isMaster] FROM [User]");
        cp.send(o);
        ReturnObject ro = (ReturnObject) cp.recieve(); 
        cp.close();        
            if(ro != null){
                if(ro.getMessage().equals("ok")){                
                    mc.getGUI().createCombolist(verwerkReturnObject(ro));                    
                }
            }else{
                System.out.println("Geen RO terug");
            }
    }
    
    /**
    * Deze methode handelt het aanmaken van een gebruiker af
    * @author Michael Stevens
    * @since 30-05-2012
    */
    public void createUser(String name, String pass, int isM){
        cp = new ComProtocol("localhost", 5555);
            ClientObject o = new ClientObject("system", "54b53072540eeeb8f8e9343e71f28176", cp.getUpdateQuery(), "INSERT INTO [User]([Name], [Password], [isMaster]) VALUES" 
                    + " (\'" + name + "\', \'" + pass + "\', " + isM + ")");
            cp.send(o);
            ReturnObject ro = (ReturnObject) cp.recieve(); 
            cp.close();        
            if(ro != null){
                if(ro.getMessage().equals("ok")){                
                   mc.getGUI().resetComboList();
                   getUsers();                   
                }
            }else{
                System.out.println("Geen RO terug");
            }  
    }
    
    /**
    * Deze methode handelt het wijzigen van een gebruiker af
    * @author Michael Stevens
    * @since 30-05-2012
    */
    public void updateUser(int index, String name, String pass, int isM){
        cp = new ComProtocol("localhost", 5555);
            ClientObject o = new ClientObject("system", "54b53072540eeeb8f8e9343e71f28176", cp.getUpdateQuery(), "UPDATE [User] SET [Name] = \'" 
                    + name + "\', [Password] = \'" + pass + "\', [isMaster] = " + isM + " WHERE [User ID] = " + data[index][0].toString());
            cp.send(o);
            ReturnObject ro = (ReturnObject) cp.recieve(); 
            cp.close();        
            if(ro != null){
                if(ro.getMessage().equals("ok")){                
                   mc.getGUI().resetComboList();
                   getUsers();                   
                }
            }else{
                System.out.println("Geen RO terug");
            }  
    }
    
    /**
    * Deze methode handelt het verwijderen van een gebruiker af
    * @author Michael Stevens
    * @since 30-05-2012
    */
    public void deleteUser(int i){
        cp = new ComProtocol("localhost", 5555);
        ClientObject o = new ClientObject("system", "54b53072540eeeb8f8e9343e71f28176", cp.getUpdateQuery(), "DELETE FROM [User] WHERE [User ID] = " + data[i][0].toString());
        cp.send(o);
        ReturnObject ro = (ReturnObject) cp.recieve(); 
        cp.close();        
            if(ro != null){
                if(ro.getMessage().equals("ok")){                
                    mc.getGUI().resetComboList();
                    getUsers();
                }
            }else{
                System.out.println("Geen RO terug");
            }
    }
    
    /**
    * Hier wordt het binnenkomende returnobject uitgelezen en worden de 
    * waarden in arrays.
    * @return de array string met naam
    * @author Michael Stevens
    * @since 30-05-2012
    */
    public String[] verwerkReturnObject(ReturnObject ro){       
        int counter = 0;
        
        name = new String[ro.getRijen().size()];
        
        data = new String[ro.getRijen().size()][ro.getKolommen().size()];
        
        for(ArrayList a:ro.getRijen()){
            int ic = 0;
            name[counter] = a.get(1).toString();
            for(Object o: a){
                data[counter][ic] = o.toString();
                ic++;
            }                       
            counter++;
        }
        return getName();
    }   
    
    /**
    * Methode om een string om te zetten naar een md5 hash. Dit voor wachtwoord encryptie
    * @return Wachtwoord als MD5 hash
    * @author Michael Stevens
    * @since 19-05-2011
    */
    public String encrypt(String s){
        String encrypted = "";
        try{            
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] array = md.digest(s.getBytes("UTF-8"));
            
            StringBuffer sb = new StringBuffer();            
            for (int i = 0; i < array.length; ++i) {
                sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
                //sb.append(Integer.toHexString(0xFF & array[i]));
            }        
            encrypted = sb.toString();            
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        return encrypted;
    }

    /**
     * @return the data
     */
    public String[][] getData() {
        return data;
    }

    /**
     * @return the name
     */
    public String[] getName() {
        return name;
    }
}
